Experimental methodology

This is the analysis of immune populations and subpopulations in the BM of 16 NSG mice that have been humanized with CD34+ human stem cells (HSC), derived from cord blood immunoseparation.

Mice were injected with MM cell line MM1S-luc at week 12 after humanization, and at week 15 they were split into 4 groups: vehicle (PBS), daratumumab 4mg/kg (intraperitoneal injection, each week), belantamab mafotdotin 1mg/kg (intraperitoneal injection, 2 times a week), and its combination.

MM1S-luc bioluminescence was monitored twice a week throught the experiment using an IVIS bioluminescent imager

Peripheral blood immune populations were monitored periodically via spectral flow cytometry (FCM, using a Cytek Aurora flow cytometer), and after 20 weeks of humanization (5 of treatment) mice were sacrificed and BM was extracted and analyzed via spectral FCM, using the following panel:

BUV395 BUV737 PacB BV480 BV605 BV711 BV786 RB780 PE Fire700 PE Cy5 PE Fire810 AF700 APC Vio770 PE Cy7 PE PE CF594 APC PerCP
CD14 CD19 CD16 CD8 CD4 CD127 CD3 CD69 CD25 CD33 HLA DR huCD45 CD56 TCRgd CD64 CD34 CD117 CD45m

FCS data analysis

Data was analyzed by Servicio de Citometría de Nucleus (Universidad de Salamanca), specifically by Dr. C. Teodosio and J. Pozo, using Infinicyt 2.0 software.

Populations were expressed as a subpopulation within another one. For instance, T cells were gates as follows:
Nucleated cells \> Human cells (CD45hu+, CD45m-) \> Lymphocytes \> T cells (CD3+)

Populations (and subpopulations) are seen as a tree-like structure. In our particular case, our population tree is defined as:

## Loading required package: ggplot2
## 
## Attaching package: 'plotly'
## The following object is masked from 'package:ggplot2':
## 
##     last_plot
## The following object is masked from 'package:stats':
## 
##     filter
## The following object is masked from 'package:graphics':
## 
##     layout
## Warning: package 'tidyverse' was built under R version 4.1.3
## Warning: package 'tibble' was built under R version 4.1.3
## Warning: package 'tidyr' was built under R version 4.1.3
## Warning: package 'readr' was built under R version 4.1.3
## Warning: package 'purrr' was built under R version 4.1.3
## Warning: package 'dplyr' was built under R version 4.1.3
## Warning: package 'stringr' was built under R version 4.1.3
## Warning: package 'forcats' was built under R version 4.1.3
## -- Attaching core tidyverse packages ------------------------ tidyverse 2.0.0 --
## v dplyr     1.1.2     v readr     2.1.4
## v forcats   1.0.0     v stringr   1.5.0
## v lubridate 1.9.3     v tibble    3.2.1
## v purrr     1.0.1     v tidyr     1.3.0
## -- Conflicts ------------------------------------------ tidyverse_conflicts() --
## x dplyr::filter() masks plotly::filter(), stats::filter()
## x dplyr::lag()    masks stats::lag()
## i Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
## Warning: package 'RColorBrewer' was built under R version 4.1.3

Raw data analysis

Utils

We need to load some libraries beforehand, and define a color palette

library(ggrepel)
library(ggsignif)
library(rstatix)
library(highcharter)

palette <- c("#8BADB3", "#A64D79", "#674EA7", "#234A6B", 
                    '#FFB347',  "#89C586", "#F26D6D", "#6D75F2","#ECC76A")
order <- c('CTRL', 'BELA', 'DARA', 'BELADARA')

Data preprocessing

FCS subpopulation data was exported on a dataframe and we used the variable % from a higher hierarchical level as a plotting function.

library(dplyr)

setwd(dirname(rstudioapi::getActiveDocumentContext()$path))
df <- readxl::read_xlsx('20240409_Mauro L12_resultados MO_ratones humanizados.xlsx')
df$id <- (gsub('.*?(\\d+\\.\\d+).*', '\\1', df$File))
df <- df %>% relocate(id, .after = File)

df$group <- gsub('.*?(CTRL|BELA|DARA|BELADARA).*', '\\1', df$File)
df <- df %>% relocate(group, .after = id)
df$`% from higher hierarchical level` <- as.numeric(df$`% from higher hierarchical level`)

We have to eliminate mice number 5.33 and 4.33 as they are a outliers on our Bioluminiscent Imaging data (data not shown).

df <- subset(df, id!= '5.33')
df <- subset(df, id!= '4.33')
df <- na.omit(df)
colnames(df)[which(names(df) == "% from higher hierarchical level")] <- "pop_perc"
df$group <- factor(df$group)
head(df)
## # A tibble: 6 x 90
##   Population        File  id    group Subpopulation Events `% from total events`
##   <chr>             <chr> <chr> <fct> <chr>          <dbl>                 <dbl>
## 1 Debris/ Doublets~ Sema~ 2.0   CTRL  EVENTS        232133                  23.2
## 2 Debris/ Doublets~ Sema~ 2.1   CTRL  EVENTS        198330                  19.9
## 3 Debris/ Doublets~ Sema~ 2.10  CTRL  EVENTS        221487                  22.1
## 4 Debris/ Doublets~ Sema~ 2.11  CTRL  EVENTS        274886                  27.5
## 5 Debris/ Doublets~ Sema~ 3.1   BELA  EVENTS        205137                  20.5
## 6 Debris/ Doublets~ Sema~ 3.10  BELA  EVENTS        247873                  25  
## # i 83 more variables: `% from nucleated cells` <chr>,
## #   `% from Human nucleated cells (excluding erythroblasts)` <chr>,
## #   pop_perc <dbl>, `Mean - SSC-A` <chr>, `Mean - FSC-A` <chr>,
## #   `Mean - CD14:BUV395-A` <chr>, `Mean - CD19:BUV737-A` <chr>,
## #   `Mean - CD16:Pacific Blue-A` <chr>, `Mean - CD8:BV480-A` <chr>,
## #   `Mean - CD4:BV605-A` <chr>, `Mean - CD127:BV711-A` <chr>,
## #   `Mean - CD3:BV786-A` <chr>, `Mean - CD45m:PerCP-Cy5.5-A` <chr>, ...

Plotting function definition

Define our function to plot our data in a stacked bar chart, using highcharter’s hchart function. First we need to make two helper functions, one to extract subpopulations which are direct children of our gigantic dataset, and make a dataframe of frequencies, grouped by experimental group and major population.

getSummaryDf <- function(subpopulation){
df_filtered <- df %>%
  filter(Subpopulation == subpopulation)
df_summary <- df_filtered %>%
  group_by(group, Population) %>%
  summarise(mean_frequency = mean(pop_perc),
            .groups='drop') %>%
  ungroup()
return(df_summary)
}

plotStackedBar <- function(subpopulation = 'Human Cells'){
  df_summary <- getSummaryDf(subpopulation) 
  df_summary$group <- factor(df_summary$group, levels = c('CTRL','BELA', 'DARA','BELADARA'), labels=c('Control', 'Belantamab','Daratumumab','Combo'))
  plot <- df_summary %>%
  hchart(
    'column', 
    hcaes(x = group, y = mean_frequency, group = Population),
    stacking = "normal"
  ) %>%
  hc_yAxis(
    title = list(text = "Mean Frequency (%)", style = list( fontSize = 16)),
    max = 100
  ) %>%
  hc_xAxis(
    title = list(text='Experimental Group', style = list( fontSize = 16)),
    categories = order
  ) %>%
    hc_title(
    text = paste0(subpopulation, ' subpopulation distribution'),
    margin = 20,
    align = "left"
    )
 return(plot)
}
library(ggpubr)
## Warning: package 'ggpubr' was built under R version 4.1.3
getGGStacked <- function(x){
  palette <- c(
'#7CB5EC','#434348', '#90ED7D', '#F7A35C',"#8085E9","#F15C80","#E4D354","#2B908F",'#f45b5b')
  df_summary <- getSummaryDf(x) 
  df_summary$group <- factor(df_summary$group, levels = c('CTRL','BELA', 'DARA','BELADARA'), labels=c('Control', 'Belantamab','Daratumumab','Combo'))
  p <- ggplot(df_summary, aes(x = group, y = mean_frequency, fill = Population)) + geom_bar(position="stack", stat="identity") + theme_bw() + scale_fill_manual(values=palette) +  labs(
    x = "Treatment group",
    title=paste0(x, ' subpopulation distribution'),
    y = "Mean Frequency(%)",
    color = "Immune population"
  ) +
  theme_minimal()+
  theme(
    legend.position='bottom',
    plot.title =element_text(size=10, face='bold', hjust=0.5),
    axis.text=element_text(size=12),
    axis.title=element_text(size=10),
  legend.text=element_text(size=8),
  legend.key.size = unit(0.5, 'line')) +guides(fill=guide_legend(nrow=3,byrow=TRUE))
  return(p)
}

p<- plotStackedBar()

htmltools::tagList(p) 

All subpopulations

From the rest of the data we can extract the subpopulations in a tree-like structure. For a given subpopulation on the main branch

subp_vector <- unique(df$Subpopulation)
subp_vector <- subp_vector[!subp_vector %in% c('EVENTS', 'Human Cells')]

a = list()
for (pop in subp_vector) {
  a[[pop]] <- plotStackedBar(pop)
}

htmltools::tagList(a) 

Saving plots

#major <- plotStackedBar()
#lymphs_plot <- plotStackedBar('Lymphocytes')
#t_plot <- plotStackedBar('T-Cells')

#plot_list <- list(major, lymphs_plot, t_plot)
#plots <- hw_grid(plot_list, ncol=1)
#htmltools::tagList(plots)
#htmlwidgets::saveWidget(widget = major, file = "major.html")
#getwd()
#webshot(url = "major.html", 
 #       file = "major.svg",
  #      delay=6)